expect用法 您所在的位置:网站首页 lindex $argv expect用法

expect用法

2023-04-09 23:19| 来源: 网络整理| 查看: 265

expect用法: 参数用法: 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行。这里的 expect 其实和 Linux 下的 bash、windows 下的 cmd 是一类东西。 注意:这一行需要在脚本的第一行,从而告知操作系统采用 expect 作为 shell 执行脚本。 注意:当使用 #!/usr/bin/expect -d 时,expect 脚本将运行在调试模式,届时脚本执行的全过程将被展示出来。 2. set timeout 设置超时时间,计时单位是:秒,timeout -1 为永不超时。 例如:set timeout 30 为设置超时时间为 30 秒。则当某个 expect 判断未能成功匹配的 30 秒后,将跳过该 expect 判断,执行后续内容。 3.spawn 它主要的功能是给运行进程加个壳,用来传递交互指令。 spawn 是进入 expect 环境后才可以执行的 expect 内部命令,如果没有装 expect 或者直接在默认的 shell 下执行是找不到 spawn 命令的。所以不要用 “which spawn“ 之类的命令去找 spawn 命令。好比在 windows 里的 dir 就是一个内部命令,这个命令由 shell 自带,你无法找到一个 dir.com 或 dir.exe 的可执行文件。 例如:spawn ssh -l username 192.168.1.1 将为 ssh -l username 192.168.1.1 加壳,届时该命令的交互指令将可以被处理。 4.expect 这里的 expect 是 expect 的一个内部命令,需要在 expect 环境中执行。该命令用于判断交互中上次输出的结果里是否包含某些字符串,如果有则立即返回。否则如果有设置超时时间,则等待超时时长后返回。 例如:expect "password:" 为判别交互输出中是否包含 "password:" 字符串。 5.send 该命令用于执行交互动作,与手工输入动作等效。 注意: 命令字符串结尾别忘记加上 "\r"(换行符),如果出现异常等待的状态可以核查一下。 例如:send "ispass\r" 为交互中输入 "is pass\r"。 6.interact 执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手工操作。如果没有该命令,命令完成后即退出。 7.$argv 参数数组 expect 脚本可以接受从 bash 传递过来的参数。 其中通过 [lindex $argv n] 可以获得第 n 个参数的值,通过 [lrange $argv a b] 可以获取 a-b 的参数值。 例如:编写 test.sh 脚本,内容如下。 #!/usr/bin/expect set timeout 2 set username [lindex $argv 0] set password [lindex $argv 1] set hostname [lindex $argv 2] spawn /usr/bin/ssh $username@$hostname expect { "yes/no" {send "yes\r"; exp_continue;} "Password:" {send "$password\r";} } expect eof 则通过调用脚本 ./test.sh oracle password 192.168.87.1 可以使用 oracle 用户以密码 password 登录 192.168.87.1,脚本最后自动登出。 8.exp_continue exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。 exp_continue 类似于控制语句中的 continue 语句。 例如:下例将判断交互输出中是否存在 yes/no 或 *assword。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *assword 则输出 123abc 并结束该段 expect 语句。 expect { \"yes/no\" {send \"yes\r\"; exp_continue;} \"*assword\" {set timeout 300; send \"123abc\r\";} } 注意:exp_continue [-continue_timer] 默认情况下 exp_continue 会重高超时时钟,-continue_timer 选项会阻止时钟重新计数(连续计数)。 ########################################### 案例一: #!/usr/bin/expect #解释说明作用 set timeout 30 #超时时间30秒 spawn ssh -l username 192.168.1.1 #spawn后接入你想要的命令 expect "password:" #期望匹配含有password的行 send "ispass\r" #发送密码,然后回车,\r表示回车确定 interact #结束,当前终端保留在远端,如果不想保留在远端,可以使用expect eof #### 案例二: 通过输入参数 #!/usr/bin/expect -f set ip [lindex $argv 0 ] #接收第一个参数,并设置IP set password [lindex $argv 1 ] #接收第二个参数,并设置密码 set timeout 10 #设置超时时间 spawn ssh root@$ip #发送ssh请滶 expect { #返回信息匹配 "*yes/no" { send "yes\r"; exp_continue} #第一次ssh连接会提示yes/no,继续 "*password:" { send "$password\r" } #出现密码提示,发送密码 } interact #交互模式,用户会停留在远程服务器上面.

 

expect用法:参数用法:1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行。这里的 expect 其实和 Linux 下的 bash、windows 下的 cmd 是一类东西。 注意:这一行需要在脚本的第一行,从而告知操作系统采用 expect 作为 shell 执行脚本。 注意:当使用 #!/usr/bin/expect -d 时,expect 脚本将运行在调试模式,届时脚本执行的全过程将被展示出来。

2. set timeout 设置超时时间,计时单位是:秒,timeout -1 为永不超时。 例如:set timeout 30 为设置超时时间为 30 秒。则当某个 expect 判断未能成功匹配的 30 秒后,将跳过该 expect 判断,执行后续内容。

3.spawn 它主要的功能是给运行进程加个壳,用来传递交互指令。 spawn 是进入 expect 环境后才可以执行的 expect 内部命令,如果没有装 expect 或者直接在默认的 shell 下执行是找不到 spawn 命令的。所以不要用 “which spawn“ 之类的命令去找 spawn 命令。好比在 windows 里的 dir 就是一个内部命令,这个命令由 shell 自带,你无法找到一个 dir.com 或 dir.exe 的可执行文件。 例如:spawn ssh -l username 192.168.1.1 将为 ssh -l username 192.168.1.1 加壳,届时该命令的交互指令将可以被处理。

4.expect 这里的 expect 是 expect 的一个内部命令,需要在 expect 环境中执行。该命令用于判断交互中上次输出的结果里是否包含某些字符串,如果有则立即返回。否则如果有设置超时时间,则等待超时时长后返回。 例如:expect "password:" 为判别交互输出中是否包含 "password:" 字符串。

5.send 该命令用于执行交互动作,与手工输入动作等效。 注意: 命令字符串结尾别忘记加上 "\r"(换行符),如果出现异常等待的状态可以核查一下。 例如:send "ispass\r" 为交互中输入 "is pass\r"。

6.interact 执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手工操作。如果没有该命令,命令完成后即退出。

7.$argv 参数数组 expect 脚本可以接受从 bash 传递过来的参数。 其中通过 [lindex $argv n] 可以获得第 n 个参数的值,通过 [lrange $argv a b] 可以获取 a-b 的参数值。 例如:编写 test.sh 脚本,内容如下。 #!/usr/bin/expect set timeout 2 set username [lindex $argv 0] set password [lindex $argv 1] set hostname [lindex $argv 2] spawn /usr/bin/ssh $username@$hostname expect { "yes/no" {send "yes\r"; exp_continue;} "Password:" {send "$password\r";} } expect eof #退出远程终端,保留在本地终端 则通过调用脚本 ./test.sh oracle password 192.168.87.1 可以使用 oracle 用户以密码 password 登录 192.168.87.1,脚本最后自动登出。-------------------------------------------------------------------------------------------------------------------------------------8.exp_continue exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。 exp_continue 类似于控制语句中的 continue 语句。

例如:下例将判断交互输出中是否存在 yes/no 或 *assword。如果匹配 yes/no 则输出 yes 并再次执行判断; 如果匹配 *assword 则输出 123abc 并结束该段 expect 语句。 expect { \"yes/no\" {send \"yes\r\"; exp_continue;} \"*assword\" {set timeout 300; send \"123abc\r\";} } 注意:exp_continue [-continue_timer] 默认情况下 exp_continue 会重高超时时钟,-continue_timer 选项会阻止时钟重新计数(连续计数)。

###########################################################################################################案例一: #!/usr/bin/expect #解释说明作用set timeout 30 #超时时间30秒spawn ssh -l username 192.168.1.1 #spawn后接入你想要的命令expect "password:" #期望匹配含有password的行send "ispass\r" #发送密码,然后回车,\r表示回车确定#expect eof #退出远程终端,保留在本地终端interact #结束,当前终端保留在远端,如果不想保留在远端,可以使用expect eof###########################################################################################################

####案例二: 通过输入参数#!/usr/bin/expect -fset ip [lindex $argv 0 ] #接收第一个参数,并设置IP set password [lindex $argv 1 ] #接收第二个参数,并设置密码 set timeout 10 #设置超时时间 spawn ssh root@$ip #发送ssh请滶 expect { #返回信息匹配 "*yes/no" { send "yes\r"; exp_continue} #第一次ssh连接会提示yes/no,继续 "*password:" { send "$password\r" } #出现密码提示,发送密码 } interact #交互模式,用户会停留在远程服务器上面. #expect eof #退出远程终端,保留在本地终端

################################################################将expect嵌入到shell脚本里面#!/bin/bashusername="root"password=redhathostname=192.168.31.115/usr/bin/expect



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有